<!DOCTYPE html>
            
<HTML>
<HEAD>
<meta name="booktitle" content="Developing Applications With Objective Caml" >
 <meta charset="ISO-8859-1"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<META name="GENERATOR" content="hevea 1.05-7 of 2000-02-24">
<META NAME="Author" CONTENT="Christian.Queinnec@lip6.fr">
<LINK rel=stylesheet type="text/css" href="videoc-ocda.css">
<script language="JavaScript" src="videoc.js"><!--
//--></script>
<TITLE>
 Exercises
</TITLE>
</HEAD>
<BODY class="regularBody">
<A HREF="book-ora155.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora157.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
<HR>

<H2> Exercises</H2><A NAME="toc227"></A>
<H3> Classes and Modules for Data Structures</H3>We wish to construct class hierarchies based on the application of
functors for classical data structures. <BR>
<BR>
We define the following structures<BR>
<BR>


<PRE><BR># <B>module</B><CODE> </CODE><B>type</B><CODE> </CODE>ELEMENT<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>sig</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>class</B><CODE> </CODE>element<CODE> </CODE><CODE>:</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>string<CODE> </CODE>-&gt;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>to_string<CODE> </CODE><CODE>:</CODE><CODE> </CODE>unit<CODE> </CODE>-&gt;<CODE> </CODE>string<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>of_string<CODE> </CODE><CODE>:</CODE><CODE> </CODE>string<CODE> </CODE>-&gt;<CODE> </CODE>unit<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><BR># <B>module</B><CODE> </CODE><B>type</B><CODE> </CODE>STRUCTURE<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>sig</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>class</B><CODE> </CODE><CODE>[</CODE><I>'a</I><CODE>]</CODE><CODE> </CODE>structure<CODE> </CODE><CODE>:</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>add<CODE> </CODE><CODE>:</CODE><CODE> </CODE><I>'a</I><CODE> </CODE>-&gt;<CODE> </CODE>unit<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>del<CODE> </CODE><CODE>:</CODE><CODE> </CODE><I>'a</I><CODE> </CODE>-&gt;<CODE> </CODE>unit<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>mem<CODE> </CODE><CODE>:</CODE><CODE> </CODE><I>'a</I><CODE> </CODE>-&gt;<CODE> </CODE>bool<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>get<CODE> </CODE><CODE>:</CODE><CODE> </CODE>unit<CODE> </CODE>-&gt;<CODE> </CODE><I>'a</I><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>all<CODE> </CODE><CODE>:</CODE><CODE> </CODE>unit<CODE> </CODE>-&gt;<CODE> </CODE><I>'a</I><CODE> </CODE>list<CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>iter<CODE> </CODE><CODE>:</CODE><CODE> </CODE><TT>(</TT><I>'a</I><CODE> </CODE>-&gt;<CODE> </CODE>unit<TT>)</TT><CODE> </CODE>-&gt;<CODE> </CODE>unit<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR>

</PRE>

<OL type=1>
<LI>
 Write a <A id="a276__1_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('1_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 1,APPEND/C-Organisationcor.ml.tex,module-param -->module</SPAN></A> with 2 parameters 
<TT>M1</TT> and <TT>M2</TT> of types <TT>ELEMENT</TT> and <TT>STRUCTURE</TT>, 
constructing a sub-class of <I>['a] structure</I> in which 
<I>'a</I> is constrained to <I>M1.element</I>.
<!-- POPUP DEFINITION -->
<layer id="l__1_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","1_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>module</B><CODE> </CODE>Struct_Elmt<CODE> </CODE><TT>(</TT>E<CODE>:</CODE>ELEMENT<TT>)</TT><CODE> </CODE><TT>(</TT>S<CODE>:</CODE>STRUCTURE<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>struct</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>class</B><CODE> </CODE>e_structure<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>inherit</B><CODE> </CODE><CODE>[</CODE>E.element<CODE>]</CODE><CODE> </CODE>S.structure<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>module Struct_Elmt :</CODE><BR><CODE>  functor(E : ELEMENT) -&gt;</CODE><BR><CODE>    functor(S : STRUCTURE) -&gt;</CODE><BR><CODE>      sig</CODE><BR><CODE>        class e_structure :</CODE><BR><CODE>          object</CODE><BR><CODE>            method add : E.element -&gt; unit</CODE><BR><CODE>            method all : unit -&gt; E.element list</CODE><BR><CODE>            method del : E.element -&gt; unit</CODE><BR><CODE>            method get : unit -&gt; E.element</CODE><BR><CODE>            method iter : (E.element -&gt; unit) -&gt; unit</CODE><BR><CODE>            method mem : E.element -&gt; bool</CODE><BR><CODE>          end</CODE><BR><CODE>      end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("1_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a simple module <TT><A id="a277__2_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('2_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 2,APPEND/C-Organisationcor.ml.tex,module-entier -->Integer</SPAN></A></TT>  
which respects the signature <TT>ELEMENT</TT>.
<!-- POPUP DEFINITION -->
<layer id="l__2_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","2_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>module</B><CODE> </CODE>Entier<CODE> </CODE><CODE>:</CODE><CODE> </CODE>ELEMENT<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>struct</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>class</B><CODE> </CODE>element<CODE> </CODE>v<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE>int_of_string<CODE> </CODE>v<CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>to_string<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>string_of_int<CODE> </CODE>n<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>of_string<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE>n<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE><TT>(</TT>int_of_string<CODE> </CODE>x<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>module Entier : ELEMENT</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("2_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a simple module<TT><A id="a278__3_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('3_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 3,APPEND/C-Organisationcor.ml.tex,module-pile -->Stack</SPAN></A></TT>  
which respects the signature <TT>STRUCTURE</TT>. 
<!-- POPUP DEFINITION -->
<layer id="l__3_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","3_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>module</B><CODE> </CODE>Pile<CODE> </CODE><CODE>:</CODE><CODE> </CODE>STRUCTURE<CODE> </CODE><CODE>=</CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>struct</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>class</B><CODE> </CODE><CODE>[</CODE><I>'a</I><CODE>]</CODE><CODE> </CODE>structure<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE><TT>(</TT><CODE> </CODE>[]<CODE> </CODE><CODE>:</CODE><CODE> </CODE><I>'a</I><CODE> </CODE>list<CODE> </CODE><TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>add<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE>p<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>x::p<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>del<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE>p<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>List.filter<CODE> </CODE><TT>(</TT><TT>(</TT><CODE>&lt;&gt;</CODE><TT>)</TT><CODE> </CODE>x<TT>)</TT><CODE> </CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>mem<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE>List.mem<CODE> </CODE>x<CODE> </CODE>p<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>get<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>List.hd<CODE> </CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>all<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>p<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>iter<CODE> </CODE>f<CODE> </CODE><CODE>=</CODE><CODE> </CODE>List.iter<CODE> </CODE>f<CODE> </CODE>p<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>module Pile : STRUCTURE</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("3_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> <A id="a279__4_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('4_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 4,APPEND/C-Organisationcor.ml.tex,module-applic -->Apply</SPAN></A> the functor to its two parameters. 
<!-- POPUP DEFINITION -->
<layer id="l__4_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","4_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>module</B><CODE> </CODE>Pile_Entier<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Struct_Elmt<TT>(</TT>Entier<TT>)</TT><TT>(</TT>Pile<TT>)</TT><CODE> </CODE>;;<BR><CODE>module Pile_Entier :</CODE><BR><CODE>  sig</CODE><BR><CODE>    class e_structure :</CODE><BR><CODE>      object</CODE><BR><CODE>        method add : Entier.element -&gt; unit</CODE><BR><CODE>        method all : unit -&gt; Entier.element list</CODE><BR><CODE>        method del : Entier.element -&gt; unit</CODE><BR><CODE>        method get : unit -&gt; Entier.element</CODE><BR><CODE>        method iter : (Entier.element -&gt; unit) -&gt; unit</CODE><BR><CODE>        method mem : Entier.element -&gt; bool</CODE><BR><CODE>      end</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("4_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Modify the <A id="a280__5_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('5_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 5,APPEND/C-Organisationcor.ml.tex,module-modif -->functor</SPAN></A> by adding the methods  
<TT>to_string</TT> and <TT>of_string</TT>.
<!-- POPUP DEFINITION -->
<layer id="l__5_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","5_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>split<CODE> </CODE>c<CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>suffix<CODE> </CODE>s<CODE> </CODE>i<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><CODE> </CODE>String.sub<CODE> </CODE>s<CODE> </CODE>i<CODE> </CODE><TT>(</TT><TT>(</TT>String.length<CODE> </CODE>s<TT>)</TT><CODE>-</CODE>i<TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE>Invalid_argument<TT>(</TT><CODE>"String.sub"</CODE><TT>)</TT><CODE> </CODE>-&gt;<CODE> </CODE><CODE>""</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE><B>rec</B><CODE> </CODE>split_from<CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>try</B><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>p<CODE> </CODE><CODE>=</CODE><CODE> </CODE>String.index_from<CODE> </CODE>s<CODE> </CODE>n<CODE> </CODE>c<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE><TT>(</TT>String.sub<CODE> </CODE>s<CODE> </CODE>n<CODE> </CODE><TT>(</TT>p<CODE>-</CODE>n<TT>)</TT><TT>)</TT><CODE> </CODE>::<CODE> </CODE><TT>(</TT>split_from<CODE> </CODE><TT>(</TT>p<CODE>+</CODE><CODE>1</CODE><TT>)</TT><TT>)</TT><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>with</B><CODE> </CODE>Not_found<CODE> </CODE>-&gt;<CODE> </CODE><CODE>[</CODE><CODE> </CODE>suffix<CODE> </CODE>s<CODE> </CODE>n<CODE> </CODE><CODE>]</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>if</B><CODE> </CODE>s<CODE>=</CODE><CODE>""</CODE><CODE> </CODE><B>then</B><CODE> </CODE>[]<CODE> </CODE><B>else</B><CODE> </CODE>split_from<CODE> </CODE><CODE>0</CODE><CODE> </CODE>;;<BR><CODE>val split : char -&gt; string -&gt; string list = &lt;fun&gt;</CODE><BR><BR># <B>module</B><CODE> </CODE>Elmt_Struct<CODE> </CODE><TT>(</TT>E<CODE>:</CODE>ELEMENT<TT>)</TT><CODE> </CODE><TT>(</TT>S<CODE>:</CODE>STRUCTURE<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>struct</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>class</B><CODE> </CODE>element<CODE> </CODE>v<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><TT>(</TT>self<TT>)</TT><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE><B>new</B><CODE> </CODE>S.structure<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>to_string<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>res<CODE> </CODE><CODE>=</CODE><CODE> </CODE>ref<CODE> </CODE><CODE>""</CODE><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>f<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE>res<CODE> </CODE><CODE>:=</CODE><CODE> </CODE><CODE>!</CODE>res<CODE> </CODE><CODE>^</CODE><CODE> </CODE><TT>(</TT><TT>(</TT>x#to_string<CODE> </CODE>()<TT>)</TT><CODE> </CODE><CODE> </CODE><CODE>^</CODE><CODE> </CODE><CODE>" "</CODE><TT>)</TT><CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>n#iter<CODE> </CODE>f<CODE> </CODE>;<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE>!</CODE>res<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>of_string<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>let</B><CODE> </CODE>l<CODE> </CODE><CODE>=</CODE><CODE> </CODE>split<CODE> </CODE><CODE>' '</CODE><CODE> </CODE>x<CODE> </CODE><B>in</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE>List.iter<CODE> </CODE><TT>(</TT><B>fun</B><CODE> </CODE>x<CODE> </CODE>-&gt;<CODE> </CODE>n#add<CODE> </CODE><TT>(</TT><B>new</B><CODE> </CODE>E.element<CODE> </CODE>x<TT>)</TT><TT>)</TT><CODE> </CODE>l<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>initializer</B><CODE> </CODE>self#of_string<CODE> </CODE>v<CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>module Elmt_Struct :</CODE><BR><CODE>  functor(E : ELEMENT) -&gt;</CODE><BR><CODE>    functor(S : STRUCTURE) -&gt;</CODE><BR><CODE>      sig</CODE><BR><CODE>        class element :</CODE><BR><CODE>          string -&gt;</CODE><BR><CODE>          object</CODE><BR><CODE>            val n : E.element S.structure</CODE><BR><CODE>            method of_string : string -&gt; unit</CODE><BR><CODE>            method to_string : unit -&gt; string</CODE><BR><CODE>          end</CODE><BR><CODE>      end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("5_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Apply the functor <A id="a281__6_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('6_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 6,APPEND/C-Organisationcor.ml.tex,module-app1 -->again</SPAN></A> , and then apply it 
to the <A id="a282__7_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('7_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 7,APPEND/C-Organisationcor.ml.tex,module-app2 -->result</SPAN></A> . 
</OL>
<!-- POPUP DEFINITION -->
<layer id="l__6_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","6_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>module</B><CODE> </CODE>Entier_Pile<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Elmt_Struct<CODE> </CODE><TT>(</TT>Entier<TT>)</TT><CODE> </CODE><TT>(</TT>Pile<TT>)</TT><CODE> </CODE>;;<BR><CODE>module Entier_Pile :</CODE><BR><CODE>  sig</CODE><BR><CODE>    class element :</CODE><BR><CODE>      string -&gt;</CODE><BR><CODE>      object</CODE><BR><CODE>        val n : Entier.element Pile.structure</CODE><BR><CODE>        method of_string : string -&gt; unit</CODE><BR><CODE>        method to_string : unit -&gt; string</CODE><BR><CODE>      end</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("6_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<!-- POPUP DEFINITION -->
<layer id="l__7_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","7_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>module</B><CODE> </CODE>Entier_Pile_Pile<CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE> </CODE>Elmt_Struct<CODE> </CODE><TT>(</TT>Entier_Pile<TT>)</TT><CODE> </CODE><TT>(</TT>Pile<TT>)</TT><CODE> </CODE>;;<BR><CODE>module Entier_Pile_Pile :</CODE><BR><CODE>  sig</CODE><BR><CODE>    class element :</CODE><BR><CODE>      string -&gt;</CODE><BR><CODE>      object</CODE><BR><CODE>        val n : Entier_Pile.element Pile.structure</CODE><BR><CODE>        method of_string : string -&gt; unit</CODE><BR><CODE>        method to_string : unit -&gt; string</CODE><BR><CODE>      end</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("7_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>
<A NAME="toc228"></A>
<H3> Abstract Types</H3>Continuing from the previous exercise, we wish to implement a module
with signature <TT>ELEMENT</TT> of which the class <TT>element</TT>
uses one instance variable of abstract type.<BR>
<BR>
We define the following parameterized type:


<PRE><BR># <B>type</B><CODE> </CODE><I>'a</I><CODE> </CODE>t<CODE> </CODE><CODE>=</CODE><CODE> </CODE>{<B>mutable</B><CODE> </CODE>x<CODE> </CODE><CODE>:</CODE><CODE> </CODE><I>'a</I><CODE> </CODE>t;<CODE> </CODE>f<CODE> </CODE><CODE>:</CODE><CODE> </CODE><I>'a</I><CODE> </CODE>t<CODE> </CODE>-&gt;<CODE> </CODE>unit};;<BR>

</PRE>
<BR>
<BR>
<OL type=1>
<LI>
 Write the <A id="a283__8_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('8_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 8,APPEND/C-Organisationcor.ml.tex,absapply -->functions</SPAN></A> <TT>apply</TT>, 
<TT>from_string</TT> and <TT>to_string</TT>. 
These last two functions will use the <TT>Marshal</TT> module.
<!-- POPUP DEFINITION -->
<layer id="l__8_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","8_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>let</B><CODE> </CODE>apply<CODE> </CODE>val_abs<CODE> </CODE><CODE>=</CODE><CODE> </CODE>val_abs<CODE>.</CODE>f<CODE> </CODE>val_abs<CODE>.</CODE>x<CODE> </CODE>;;<BR><CODE>val apply : 'a t -&gt; unit = &lt;fun&gt;</CODE><BR># <B>let</B><CODE> </CODE>from_string<CODE> </CODE>s<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Marshal.from_string<CODE> </CODE>s<CODE> </CODE><CODE>0</CODE><CODE> </CODE>;;<BR><CODE>val from_string : string -&gt; 'a = &lt;fun&gt;</CODE><BR># <B>let</B><CODE> </CODE>to_string<CODE> </CODE>v<CODE> </CODE><CODE>=</CODE><CODE> </CODE>Marshal.to_string<CODE> </CODE>v<CODE> </CODE><CODE>[</CODE>Marshal<CODE>.</CODE>Closures<CODE>]</CODE><CODE> </CODE>;;<BR><CODE>val to_string : 'a -&gt; string = &lt;fun&gt;</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("8_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a <A id="a284__9_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('9_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 9,APPEND/C-Organisationcor.ml.tex,abssig -->signature</SPAN></A> <TT>S</TT> which corresponds  
to the signature previously inferred by abstracting the type <I>t</I>.
<!-- POPUP DEFINITION -->
<layer id="l__9_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","9_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>module</B><CODE> </CODE><B>type</B><CODE> </CODE>S<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>sig</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>type</B><CODE> </CODE>t<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>apply<CODE> </CODE><CODE>:</CODE><CODE> </CODE>t<CODE> </CODE>-&gt;<CODE> </CODE>unit<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>from_string<CODE> </CODE><CODE>:</CODE><CODE> </CODE>string<CODE> </CODE>-&gt;<CODE> </CODE>t<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE>to_string<CODE> </CODE><CODE>:</CODE><CODE> </CODE>t<CODE> </CODE>-&gt;<CODE> </CODE>string<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>module type S =</CODE><BR><CODE>  sig</CODE><BR><CODE>    type t</CODE><BR><CODE>    val apply : t -&gt; unit</CODE><BR><CODE>    val from_string : string -&gt; t</CODE><BR><CODE>    val to_string : t -&gt; string</CODE><BR><CODE>  end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("9_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> Write a <A id="a285__10_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('10_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 10,APPEND/C-Organisationcor.ml.tex,absfonct -->functor</SPAN></A> which takes a parameter  
with signature <TT>S</TT> and returns a module of which the signature
is compatible with <TT>ELEMENT</TT>.
<!-- POPUP DEFINITION -->
<layer id="l__10_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","10_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>module</B><CODE> </CODE>Element_of<CODE> </CODE><TT>(</TT>M<CODE>:</CODE>S<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>struct</B><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>class</B><CODE> </CODE>element<CODE> </CODE>v<CODE> </CODE><CODE>=</CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>object</B><CODE> </CODE><CODE> </CODE><CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>val</B><CODE> </CODE><B>mutable</B><CODE> </CODE>n<CODE> </CODE><CODE>=</CODE><CODE> </CODE>M.from_string<CODE> </CODE>v<BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>to_string<CODE> </CODE>()<CODE> </CODE><CODE>=</CODE><CODE> </CODE>M.to_string<CODE> </CODE>n<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>method</B><CODE> </CODE>of_string<CODE> </CODE>x<CODE> </CODE><CODE>=</CODE><CODE> </CODE>n<CODE> </CODE><CODE>&lt;-</CODE><CODE> </CODE>M.from_string<CODE> </CODE>x<CODE> </CODE><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><BR><CODE> </CODE><CODE> </CODE><CODE> </CODE><B>end</B><CODE> </CODE>;;<BR><CODE>module Element_of :</CODE><BR><CODE>  functor(M : S) -&gt;</CODE><BR><CODE>    sig</CODE><BR><CODE>      class element :</CODE><BR><CODE>        string -&gt;</CODE><BR><CODE>        object</CODE><BR><CODE>          val mutable n : M.t</CODE><BR><CODE>          method of_string : string -&gt; unit</CODE><BR><CODE>          method to_string : unit -&gt; string</CODE><BR><CODE>        end</CODE><BR><CODE>    end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("10_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script><BR>
<BR>

<LI> <A id="a286__11_APPEND/C-Organisationcor.ml.tex" href="javascript: void showMessage('11_APPEND/C-Organisationcor.ml.tex')" class="mousable"><SPAN style=""><!-- 11,APPEND/C-Organisationcor.ml.tex,absprec -->Use</SPAN></A> the resulting module as the parameter of  
the module from the previous exercise.
<!-- POPUP DEFINITION -->
<layer id="l__11_APPEND/C-Organisationcor.ml.tex" class="hint" style="visibility:hidden; position:absolute" visibility="hide"  width="50%">
<script language="JavaScript"><!--
  openPopUp("50%","11_APPEND/C-Organisationcor.ml.tex","");
// --></script><span style="">
 

<PRE><BR># <B>module</B><CODE> </CODE>Abstrait_Pile<CODE> </CODE><TT>(</TT>M<CODE>:</CODE>S<TT>)</TT><CODE> </CODE><CODE>=</CODE><CODE> </CODE><CODE> </CODE>Elmt_Struct<CODE> </CODE><TT>(</TT>Element_of<TT>(</TT>M<TT>)</TT><TT>)</TT><CODE> </CODE>;;<BR><CODE>module Abstrait_Pile :</CODE><BR><CODE>  functor(M : S) -&gt;</CODE><BR><CODE>    functor(S : STRUCTURE) -&gt;</CODE><BR><CODE>      sig</CODE><BR><CODE>        class element :</CODE><BR><CODE>          string -&gt;</CODE><BR><CODE>          object</CODE><BR><CODE>            val n : Element_of(M).element S.structure</CODE><BR><CODE>            method of_string : string -&gt; unit</CODE><BR><CODE>            method to_string : unit -&gt; string</CODE><BR><CODE>          end</CODE><BR><CODE>      end</CODE><BR>

</PRE>

</span><script language="JavaScript"><!--
  closePopUp("11_APPEND/C-Organisationcor.ml.tex");
// --></script></layer><!-- END OF POPUP -->
<script language="JavaScript"><!--
  initializePreviousHints();
// --></script></OL><HR>
<A HREF="book-ora155.html"><IMG SRC ="previous_motif.gif" ALT="Previous"></A>
<A HREF="index.html"><IMG SRC ="contents_motif.gif" ALT="Contents"></A>
<A HREF="book-ora157.html"><IMG SRC ="next_motif.gif" ALT="Next"></A>
</BODY>
</HTML>
